import request from '@/utils/request'
import upload from '@/utils/upload'
import config from '@/config'
import { getToken } from '@/utils/auth'

// 获取项目列表
export function listAllProjectContractInfo(query) {
  return request({
    // url: '/production/projectContractInfo/listAll',
    url: '/production/projectContractInfo/listByUser', //查询工程项目信息根据用户
    method: 'get',
    params: query,
  })
}

// 获取文件夹列表
export function listProjectFolder(query) {
  return request({
    url: '/production/projectFolder/list',
    method: 'get',
    params: query,
  })
}
// 获取部门制度文件夹列表
export function listProjectFolder2(query) {
  return request({
    url: '/production/companyNoticeFolder/list',
    method: 'get',
    params: query,
  })
}
// 查询部门制度项目文件列表
export function listProjectFileInfo2(query) {
  return request({
    url: '/production/companyNoticeFile/list',
    method: 'get',
    params: query,
  })
}

// 新增文件夹
export function addProjectFolder(data) {
  return request({
    url: '/production/projectFolder/add',
    method: 'post',
    data: data,
  })
}

// 修改文件夹
export function updateProjectFolder(data) {
  return request({
    url: '/production/projectFolder/edit',
    method: 'post',
    data: data,
  })
}

// 删除文件夹
export function delProjectFolder(id) {
  return request({
    url: `/production/projectFolder/remove/${id}`,
    method: 'get',
  })
}

// 获取文件列表
export function listProjectFileInfo(query) {
  return request({
    url: '/production/projectFileInfo/list',
    method: 'get',
    params: query,
  })
}

// 获取文件详情
export function getProjectFileInfo(id) {
  return request({
    url: `/production/projectFileInfo/getInfo/${id}`,
    method: 'get',
  })
}

// 删除文件
export function delProjectFileInfo(id) {
  return request({
    url: `/production/projectFileInfo/remove/${id}`,
    method: 'get',
  })
}

// 部门制度文件上传（fileType == 97 时使用）
export function addProjectFileInfo2({
  files,
  folderId,
  fileType,
  projectId,
  menuCategory,
}) {
  // #ifdef H5
  // H5 平台使用 FormData + uni.request
  const formData = new FormData()

  // 兼容 uni-file-picker 返回的文件结构（包含 file/url 等字段）
  ;(files || []).forEach((item) => {
    const realFile = item && item.file ? item.file : item
    if (realFile) {
      formData.append('files', realFile)
    }
  })
  formData.append('folderId', folderId)
  formData.append('fileType', fileType)
  if (menuCategory !== undefined && menuCategory !== null) {
    formData.append('menuCategory', menuCategory)
  }
  return request({
    url: '/production/companyNoticeFile/addByFile',
    method: 'post',
    data: formData,
    timeout: 5 * 60 * 1000,
    headers: {
      'X-Requested-With': 'XMLHttpRequest',
    },
  })
  // #endif

  // #ifndef H5
  // 非 H5 平台（小程序、App）使用 uni.uploadFile 逐个上传
  const baseUrl = config.baseUrl
  const uploadUrl = baseUrl + '/production/companyNoticeFile/addByFile'
  const fileList = files || []
  
  if (fileList.length === 0) {
    return Promise.reject(new Error('没有选择文件'))
  }

  // 准备 formData（所有文件共用相同的参数）
  const formData = {
    folderId: folderId || '',
    fileType: fileType || '',
  }
  if (menuCategory !== undefined && menuCategory !== null) {
    formData.menuCategory = menuCategory
  }

  // 准备 header
  const header = {}
  if (getToken()) {
    header['Authorization'] = 'Bearer ' + getToken()
  }

  // 逐个上传文件
  const uploadPromises = fileList.map((item, index) => {
    let filePath = item.path || item.url
    
    if (!filePath && item.file) {
      filePath = item.file.path || item.file.url
    }
    
    if (!filePath && item.tempFiles && item.tempFiles[0]) {
      filePath = item.tempFiles[0].path
    }
    
    if (!filePath) {
      console.error('文件路径获取失败，文件对象:', item)
      return Promise.reject(new Error(`文件 ${index + 1} 路径不存在`))
    }

    return new Promise((resolve, reject) => {
      uni.uploadFile({
        url: uploadUrl,
        filePath: filePath,
        name: 'files',
        formData: formData,
        header: header,
        timeout: 5 * 60 * 1000,
        success: (res) => {
          try {
            const result = typeof res.data === 'string' ? JSON.parse(res.data) : res.data
            const code = result.code || 200
            if (code === 200) {
              resolve(result)
            } else {
              reject(new Error(result.msg || '上传失败'))
            }
          } catch (e) {
            console.error('解析响应失败:', e, res.data)
            reject(new Error('解析响应失败: ' + e.message))
          }
        },
        fail: (error) => {
          console.error('上传文件失败:', error, filePath)
          reject(error)
        }
      })
    })
  })

  return Promise.all(uploadPromises).then((results) => {
    return results[results.length - 1]
  })
  // #endif
}

// 多文件上传
export function addProjectFileInfoByFile({
  files,
  folderId,
  fileType,
  projectId,
  menuCategory,
}) {
  // #ifdef H5
  // H5 平台使用 FormData + uni.request
  const formData = new FormData()

  // 兼容 uni-file-picker 返回的文件结构（包含 file/url 等字段）
  ;(files || []).forEach((item) => {
    // H5 下 uni-file-picker 会在对象里挂一个 file 字段，是真正的 File/Blob 对象
    const realFile = item && item.file ? item.file : item
    if (realFile) {
      formData.append('files', realFile)
    }
  })
  formData.append('folderId', folderId)
  formData.append('fileType', fileType)
  formData.append('projectId', projectId)
  if (menuCategory !== undefined && menuCategory !== null) {
    formData.append('menuCategory', menuCategory)
  }
  return request({
    url: '/production/projectFileInfo/addByFile',
    method: 'post',
    data: formData,
    timeout: 5 * 60 * 1000,
    headers: {
      'X-Requested-With': 'XMLHttpRequest',
    },
  })
  // #endif

  // #ifndef H5
  // 非 H5 平台（小程序、App）使用 uni.uploadFile 逐个上传
  const baseUrl = config.baseUrl
  const uploadUrl = baseUrl + '/production/projectFileInfo/addByFile'
  const fileList = files || []
  
  if (fileList.length === 0) {
    return Promise.reject(new Error('没有选择文件'))
  }

  // 准备 formData（所有文件共用相同的参数）
  const formData = {
    folderId: folderId || '',
    fileType: fileType || '',
    projectId: projectId || '',
  }
  if (menuCategory !== undefined && menuCategory !== null) {
    formData.menuCategory = menuCategory
  }

  // 准备 header
  const header = {}
  if (getToken()) {
    header['Authorization'] = 'Bearer ' + getToken()
  }

  // 逐个上传文件
  const uploadPromises = fileList.map((item, index) => {
    // 获取文件路径：非 H5 平台，uni-file-picker 返回的是 path 字段
    // 注意：uni-file-picker 返回的文件对象结构可能是：
    // - item.path (直接路径)
    // - item.url (URL路径，可能是临时路径)
    // - item.file.path (嵌套的文件对象)
    let filePath = item.path || item.url
    
    // 如果 item 是 uni-file-picker 返回的完整对象，可能包含 file 字段
    if (!filePath && item.file) {
      filePath = item.file.path || item.file.url
    }
    
    // 如果还是没有，尝试从 tempFiles 结构获取
    if (!filePath && item.tempFiles && item.tempFiles[0]) {
      filePath = item.tempFiles[0].path
    }
    
    if (!filePath) {
      console.error('文件路径获取失败，文件对象:', item)
      return Promise.reject(new Error(`文件 ${index + 1} 路径不存在`))
    }

    return new Promise((resolve, reject) => {
      uni.uploadFile({
        url: uploadUrl,
        filePath: filePath,
        name: 'files', // 后端接收文件的字段名
        formData: formData,
        header: header,
        timeout: 5 * 60 * 1000, // 5分钟超时
        success: (res) => {
          try {
            const result = typeof res.data === 'string' ? JSON.parse(res.data) : res.data
            const code = result.code || 200
            if (code === 200) {
              resolve(result)
            } else {
              reject(new Error(result.msg || '上传失败'))
            }
          } catch (e) {
            console.error('解析响应失败:', e, res.data)
            reject(new Error('解析响应失败: ' + e.message))
          }
        },
        fail: (error) => {
          console.error('上传文件失败:', error, filePath)
          reject(error)
        }
      })
    })
  })

  // 等待所有文件上传完成
  return Promise.all(uploadPromises).then((results) => {
    // 返回最后一个结果（或者可以合并所有结果）
    return results[results.length - 1]
  })
  // #endif
}

// 下载链接转换
export function fileLinkTransfer(url) {
  return request({
    url: `/file/cos/sts?keyUrl=${encodeURIComponent(url)}`,
    method: 'get',
  })
}

// 预览链接转换
export function fileLinkLooking(url) {
  return request({
    url: `/file/cos/preview?keyUrl=${encodeURIComponent(url)}`,
    method: 'get',
  })
}

// 获取字典数据
export function getDictData(dictType) {
  return request({
    url: `/system/dict/data/type/${dictType}`,
    method: 'get',
  })
}
